package com.juzi.AbstractClass;

public class Introduce {
    public static void main(String[] args) {
        System.out.println("=============================================\n" +
                "抽象类\n" +
                "在Java中abstract是抽象的意思，可以修饰类、成员方法。\n" +
                "abstract修饰类，这个类就是抽象类；修饰方法，这个方法就是抽象方法。\n" +
                "\n" +
                "修饰符 abstract class 类名{ \n" +
                "\t修饰符 abstract 返回值类型 方法名称(形参列表)；\n" +
                " }\n" +
                "\n" +
                "public abstract class Animal{\n" +
                "        public abstract void run();\n" +
                "}\n" +
                "-------------------------------------\n" +
                "注意事项\n" +
                "抽象方法只有方法签名，不能声明方法体。\n" +
                "一个类中如果定义了抽象方法，这个类必须声明成抽象类，否则报错。\n" +
                "\n" +
                "-------------------------------------\n" +
                "抽象的使用场景\n" +
                "抽象类可以理解成不完整的设计图，一般作为父类，让子类来继承。\n" +
                "当父类知道子类一定要完成某些行为，但是每个子类该行为的实现又不同，于是该父类就把该行为定义成抽象方法的形式，具体实现交给子类去完成。此时这个类就可以声明成抽象类。\n" +
                "\n" +
                "public abstract class Animal{\n" +
                "    public abstract void run();\n" +
                "}\n" +
                "-------------------------------------\n" +
                "1、抽象类、抽象方法是什么样的？\n" +
                "都是用abstract修饰的；抽象方法只有方法签名，不能写方法体。\n" +
                "一个类中定义了抽象方法，这个类必须声明成抽象类。\n" +
                "-------------------------------------\n" +
                "2、抽象类基本作用是啥？\n" +
                "作为父类，用来被继承的。\n" +
                "-------------------------------------\n" +
                "3、继承抽象类有哪些要注意？\n" +
                "一个类如果继承了抽象类，那么这个类必须重写完抽象类的全部抽象方法，否则这个类也必须定义成抽象类。\n" +
                "-------------------------------------\n" +
                "特征和注意事项\n" +
                "类有的成员（成员变量、方法、构造器）抽象类都具备\n" +
                "抽象类中不一定有抽象方法，有抽象方法的类一定是抽象类\n" +
                "一个类继承了抽象类必须重写完抽象类的全部抽象方法，否则这个类也必须定义成抽象类。\n" +
                "不能用abstract修饰变量、代码块、构造器。\n" +
                "最重要的特征：得到了抽象方法，失去了创建对象的能力（有得有失）\n" +
                "-------------------------------------\n" +
                "final和abstract是什么关系？\n" +
                "互斥关系\n" +
                "abstract定义的抽象类作为模板让子类继承，final定义的类不能被继承。\n" +
                "抽象方法定义通用功能让子类重写，final定义的方法子类不能重写。\n" +
                "\n" +
                "-------------------------------------\n" +
                "什么时候使用模板方法模式\n" +
                "使用场景说明：当系统中出现同一个功能多处在开发，而该功能中大部分代码是一样的，只有其中部分可能不同的时候。\n" +
                "-------------------------------------\n" +
                "模板方法模式实现步骤\n" +
                "1、定义一个抽象类。2、定义2个方法，一个是模板方法：把相同代码放里面去，不同代码定义成抽象方法\n" +
                "3、子类继承抽象类，重写抽象方法。\n" +
                "-------------------------------------\n" +
                "模板方法我们是建议使用final修饰的，这样会更专业，那么为什么呢？\n" +
                "答：模板方法是给子类直接使用的，不是让子类重写的，\n" +
                "一旦子类重写了模板方法，则模板方法就失效了，因此，加上final后可以防止子类重写了模板方法，这样更安全、专业。\n" +
                "-------------------------------------\n" +
                "1、模板方法模式解决了什么问题？\n" +
                " 提高了代码的复用性\n" +
                " 模板方法已经定义了通用结构，模板方法不能确定的部分定义成抽象方法，交给子类实现，因此，使用者只需要关心自己需要实现的功能即可。\n" +
                "\n" +
                "");
    }
}
